www.gusucode.com > C++ QQ农场源代码程序 > C++ QQ农场源代码程序/code/qq农场源代码/qq农场源代码/GETINFO.cpp

    // GETINFO.cpp : implementation file
//

#include "stdafx.h"
#include "SKSGODweb.h"
#include "GETINFO.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////////

#define QQ_HOST "http://happyfarm.xiaoyou.qq.com"		//服务器地址
#define FirendInfo "/api.php?mod=friend&refresh=false"	//得到好友列表

/////////////////////////////////////////////////////////////////////////////
// CGETINFO dialog
#ifndef MAX_PACK

#define MAX_PACK 256*1024	//数据包最大值
#endif
//专用线程,刷新列表中的信息
UINT Tscaninfo(LPVOID lp);

//商店里面所有东西
DONGXI	dongxi[]=
{ 
	{0,		0,	125,	10*60*60,	272,	15,	"000"},
	{0,		0,	125,	10*60*60,	272,	15,	"萝卜"},
	//////////////////////////////////////////////////////////////////////////
	{1,		0,	125,	10*60*60,	272,	15,	"白萝卜"},
	{2,		0,	163,	13*60*60,	272,	18,	"胡萝卜"},
	{3,		3,	125,	14*60*60,	272,	19,	"玉米"},
	{4,		4,	125,	15*60*60,	272,	20,	"土豆"},
	{5,		5,	125,	16*60*60,	272,	20,	"茄子"},
	{6,		6,	125,	17*60*60,	272,	20,	"番茄"},
	{7,		7,	125,	18*60*60,	272,	20,	"豌豆"},
	{8,		8,	125,	20*60*60,	272,	20,	"辣椒"},
	{9,		9,	125,	22*60*60,	272,	20,	"南瓜"},
	{10,	10,	125,	21*60*60,	272,	20,	"苹果"},
	{11,	10,	605,	24*60*60,	272,	20,	"草莓"},
	{12,	11,	708,	28*60*60,	272,	20,	"西瓜"},
	{13,	12,	900,	31*60*60,	272,	20,	"香蕉"},
	{14,	13,	900,	42*60*60,	272,	20,	"桃子"},
	{15,	14,	900,	37*60*60,	272,	20,	"橙子"},
	{16,	15,	900,	46*60*60,	272,	20,	"葡萄"},
	{17,	16,	900,	52*60*60,	272,	20,	"石榴"},
	{18,	14,	900,	61*60*60,	272,	20,	"柚子"},
	{19,	18,	900,	64*60*60,	272,	20,	"菠萝"},
	{20,	19,	900,	55*60*60,	272,	20,	"椰子"},
	{21,	20,	900,	61*60*60,	272,	20,	"葫芦"},
	//////////////////////////////////////////////////////////////////////////
	
	{22,	12,	900,	31*60*60,	272,	20,	"完成了"},
	{23,	12,	900,	31*60*60,	272,	20,	"备用"},
};



//从一个字符中,开始点起,取出一个值
//找不到了返回0 
//从特殊点开始搜索,结束点为: ",""
int FindQQstr(CString str, CString csWillFind ,int nstart,CString &csRer)
{
	
	int nStr=str.Find(csWillFind,nstart);
	int nEnd=0; // 所取位置结束点
	if (nStr == -1)
	{
		//	jein_outinfo("返回 0 ,没有找到:%s	 开始点:%d ",csWillFind ,nstart);
		return 0;	//不存这个值了
	}
	else
	{
		int nEnd=-1;
		if (csWillFind == "money")	//钱结束标志	},
		{
			nEnd = str.Find("},", nStr );
		}
		else
		{
			//{"userId":95105214,"userName":"\u738b\u56fd\u680b",
			nEnd = str.Find(",\"", nStr );	//取得结束点
			
		}
		if (nEnd == -1)
		{
			jein_outinfo("结束点取得失败:%d",nEnd);
			return 0;
		}
		//开始点要 +2 //":
		nStr =nStr +  csWillFind.GetLength()  ;
		int nCount = nEnd - nStr;	//要取得的字符数
		csRer = str.Mid(nStr,nCount);
		//////////////////////////////////////////////////////////////////////////
		csRer.Replace(":","");	
		csRer.Replace("\"","");
		csRer.Replace("\\","");
		return nEnd;	//结束点
		
		
		
	}
	
	return 0;
}
//#define CTRY_SYRIA                963         // Syria
int UCSTo(wchar_t* pUCS,char *p,int codepage) //963
{ 
	int len = 0; 
	
	if(pUCS == NULL || p == NULL) 
		return -1; 
	
	len = WideCharToMultiByte(codepage,0,pUCS,-1,NULL,0,NULL,NULL); 
	WideCharToMultiByte(codepage,0,pUCS,-1,p,len,NULL,NULL); 
	len--; 
	return len; 
} 

//////////////////////////////////////////////////////////////////////////
//功能: 将 形如: \\u738b\\u56fd\\u680b 字符转为 char
//instrname :传入 16 进制串即可, 可删除 \ u "
void GetName(CString instrname,CHAR name[64])
{
	instrname.Replace("\\","");
	instrname.Replace("u","");
	instrname.Replace("\"","");
	instrname.Replace(":","");
	instrname.TrimLeft();
	instrname.TrimRight();
	int nlen = instrname.GetLength();	//得到字符长度
	int nnamelen = nlen/4;				//角色名长
	if(nnamelen>8)
	{
		jein_outinfo("名字太长: %s",instrname);
		return  ;
	}
	CString cs2wei;
	for (int i=0;i<nlen/2;i++)
	{
		cs2wei = instrname.Mid(i*2,2);	//得到的二位
		name[i]=	strtol(cs2wei,0,16);
	}
	//////////////////////////////////////////////////////////////////////////
	//移位转换
	for (int j=0;j*2<nlen; j++)
	{
		int temp = name[2*j];
		name[2*j]=name[2*j + 1];	
		name[2*j + 1] =temp;
	}
	//////////////////////////////////////////////////////////////////////////
	char buftemp[64];
	memset(buftemp,0,sizeof(buftemp));
	UCSTo((wchar_t*)name,buftemp,936);
	ZeroMemory(name,sizeof(name));
	strcpy(name,buftemp);
	//strncpy(name,buftemp,nlen/2);
	
}

CGETINFO::CGETINFO(CWnd* pParent /*=NULL*/)
: CDialog(CGETINFO::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGETINFO)
	m_web = _T("http://happyfarm.xiaoyou.qq.com/api.php?mod=friend&refresh=false");
	m_str_show = _T("");
	//}}AFX_DATA_INIT
}

LRESULT CGETINFO::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CDialog::DefWindowProc(message, wParam, lParam);
}

BOOL CGETINFO::DestroyWindow() 
{
	
	return CDialog::DestroyWindow();
}



void CGETINFO::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGETINFO)
	DDX_Control(pDX, IDC_LIST3_info_insert, m_ctrl_list);
	DDX_Control(pDX, IDC_LIST1, m_list);
	DDX_Text(pDX, IDC_EDIT2_WEB, m_web);
	DDX_Text(pDX, IDC_EDIT1_show, m_str_show);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CGETINFO, CDialog)
//{{AFX_MSG_MAP(CGETINFO)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON10, OnButton10)
ON_BN_CLICKED(IDC_BUTTON11, OnTestRead)
ON_BN_CLICKED(IDC_BUTTON12, OnButton12)
ON_NOTIFY(NM_CLICK, IDC_LIST3_info_insert, OnClickLIST3infoinsert)
ON_BN_CLICKED(IDC_BUTTON2, OnOneInfo)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//先读取自己的好友列表,存放到玩家数组
//得到好友信息
BOOL CGETINFO::GetFriendInfo()
{ 
	CString httpweb = (CString) QQ_HOST +(CString) FirendInfo;
	char *buf=new char[MAX_PACK];
	if (buf == 0)
	{
		AfxMessageBox("申请指针失败");
		return 0;
	}
	int ngetlen =	 jein_gethtml(httpweb,buf,MAX_PACK);
	jein_outinfo("得到好友信息长度:%d",ngetlen);
	if (strstr(buf,"errorType\":\"session"))
	{
		delete buf;
		AfxMessageBox("得到好友信息出错,检查是否已经登录,或者连接已超时");
		return 0;
	}
	//////////////////////////////////////////////////////////////////////////
	
	int nowrole=0;
	int nowoffset=1;	//开始点
	
	
	//////////////////////////////////////////////////////////////////////////
	m_allnum=0;	//初始化好友0
	while(nowoffset) 
	{
		CString struserid;
		CString strtemp;
		nowoffset =  FindQQstr( buf,"userId",nowoffset,struserid);
		if (nowoffset == 0)
		{
			
			jein_outinfo("搜索完成");
			break;
		}
		//////////////////////////////////////////////////////////////////////////
		//再搜索名字显示
		//"userName\":\"\u738b\u56fd\u680b\",\"headPic
		FindQQstr( buf,"userName",nowoffset,strtemp);
		char nametemp[64];
		strtemp.Replace("u","");
		GetName(strtemp, nametemp );
		//////////////////////////////////////////////////////////////////////////
		//钱
		CString csmoney;
		FindQQstr(buf,"money",nowoffset,csmoney);
		//////////////////////////////////////////////////////////////////////////
		//经验
		CString csexp;
		FindQQstr(buf,"exp",nowoffset,csexp);
		//////////////////////////////////////////////////////////////////////////
		//角色处理有点小bug
		CString csnamebug=nametemp;
		csnamebug.Replace("?","");
		
		if (struserid.IsEmpty() && csnamebug.IsEmpty())
		{
			jein_outinfo("名字与 ID 同为空");
			continue;
		}
		//////////////////////////////////////////////////////////////////////////
		//添加好友信息到总结构体中
		strcpy(friendinfo[m_allnum].szuserid, struserid );	//角色 id
		friendinfo[m_allnum].userId = atoi(struserid);		//角色ID
		
		strcpy(friendinfo[m_allnum].userName,csnamebug);	//角色名	//nametemp
		friendinfo[m_allnum].exp = atoi(csexp);				
		friendinfo[m_allnum].money =atoi(csmoney);
		
		//////////////////////////////////////////////////////////////////////////
		//添加到控件
		m_ctrl_list.InsertItem(m_allnum,"");
		m_ctrl_list.SetItemText(m_allnum,0, nametemp );		//名字
		m_ctrl_list.SetItemText(m_allnum,1, struserid );	//ID
		m_ctrl_list.SetItemText(m_allnum,2,csmoney);		//钱
		m_ctrl_list.SetItemText(m_allnum,3,csexp);			//经验
		
		
		m_allnum++;			//好友总数++
		//////////////////////////////////////////////////////////////////////////
		m_list.AddString((CString)strtemp);
		m_list.AddString((CString)nametemp);
		nowrole++;
		if (nowrole>500)		break;
	} 
	
	delete buf;
	//////////////////////////////////////////////////////////////////////////
	
	//////////////////////////////////////////////////////////////////////////
	
	return 1;
}

//////////////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////////////

void CGETINFO::OnButton1() 
{
	
 //	GetFriendInfo();
}

//得到一个URL内容 
void CGETINFO::OnButton10() 
{
  	 UpdateData();
	 
	 CString web= m_web;
	 char *buf=new char[MAX_PACK];
	 if (buf == 0)
	 {
		 AfxMessageBox("申请指针失败");
		 return ;
	 }
	 jein_gethtml(web,buf,MAX_PACK);
	 m_str_show=  buf;
	 delete buf;
	 UpdateData(false);
	 //////////////////////////////////////////////////////////////////////////
}

//  GET /api.php?mod=user&act=run&flag=1&ownerId=262807117
//得到一个id 的信息
void CGETINFO::GetRoleInfo(CString id)
{
	CString path ="/api.php?mod=user&act=run&flag=1&ownerId="+id;
	path =(CString)QQ_HOST+path;
	jein_outinfo("请求地址好友地址: %s",path);
	char buf[64*1024];
	jein_gethtml(path,buf,MAX_PACK);	//
	
}

//初始化控件列表
void CGETINFO::InitTab()
{
	static int is=1;
	
	int i=0;
	ListView_SetExtendedListViewStyle(m_ctrl_list.m_hWnd,LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT);
	
	if (is)
	{
		is=!is;
		m_ctrl_list.DeleteAllItems();
		for (int i=0;i<8;i++)	m_ctrl_list.DeleteColumn(0);
		
		m_ctrl_list.InsertColumn(i++,"姓名",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"ID",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"金钱",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"经验",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"0000000",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"000000",LVCFMT_LEFT,80);
	}
	else
	{
		is=!is;
		m_ctrl_list.DeleteAllItems();
		for (int i=0;i<8;i++)	m_ctrl_list.DeleteColumn(0);
		
		m_ctrl_list.InsertColumn(i++,"编号",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"名字",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"土地",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"作物",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"播种时间",LVCFMT_LEFT,120);
		m_ctrl_list.InsertColumn(i++,"状态",LVCFMT_LEFT,80);
		m_ctrl_list.InsertColumn(i++,"成熟时间",LVCFMT_LEFT,80);
	}
	
	
}


BOOL CGETINFO::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	m_allnum = 0 ;	//好友数量
	
	InitTab();	
	GetFriendInfo();	//刷新好友列表
		AfxBeginThread(Tscaninfo,this);
	return TRUE;  // return TRUE unless you set the focus to a control
	// EXCEPTION: OCX Property Pages should return FALSE
}

void CGETINFO::OnTestRead() 
{ 
	
}
//////////////////////////////////////////////////////////////////////////
//植物的状态
struct WZT	 {
	int ztdj;
	char ztname[32];
};

WZT jeinzt[]=
{
	{0,	"成熟状态"},
	{1,	"未发芽"},
	{2,	"发芽 "},
	{3,	"小叶子"},
	{4,	"大叶子"},
	{5,	"开花"},
	{6,	"成熟"},
	{7,	"已经收获"},
};

//////////////////////////////////////////////////////////////////////////



void CGETINFO::OnClickLIST3infoinsert(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	
	int n =m_ctrl_list.GetNextItem(-1,   LVIS_SELECTED);   
	char bbbb[MAX_PATH];
	m_ctrl_list.GetItemText(n,1,bbbb,MAX_PATH);
	char bufweb[MAX_PATH];
	sprintf(bufweb,"%s%s",WEB_GETONEINFO,bbbb);
	m_web = bufweb;
	UpdateData(false);
	
	*pResult = 0;
}
//////////////////////////////////////////////////////////////////////////


//对好友田里面的东西分析 
void CGETINFO::FX_TIAN(char *buf)
{
	
	CString csbuf=buf;
	
	int nstatcount=10;	//开始点
	
	CString csa;	//植物种类 
	CString csDj;	//成熟等级
	CString cstime;	//
	
	//////////////////////////////////////////////////////////////////////////
	for (int i=0;i<64;i++)
	{
		nstatcount = csbuf.Find("{",nstatcount);
		if (nstatcount==-1 || nstatcount== 0)	break;
		if(FindQQstr(csbuf,"a",nstatcount,csa) ==0)	break;
		FindQQstr(csbuf,"q",nstatcount,cstime);	
		int type = atoi(csa);	//得到他的类型
		FindQQstr(csbuf,"b",nstatcount,csDj);	//成熟等级
		int csdj = atoi(csDj); 
		//////////////////////////////////////////////////////////////////////////
		char sztimeformat[64];
		int dwtime=atoi(cstime);
		TimeFormat(dwtime,sztimeformat);
		
		jein_outinfo("%d:植物种类: %s	种植时间: %s 名字:%s	%s",nstatcount,csa,sztimeformat,dongxi[type].name , jeinzt[csdj].ztname);
		
		nstatcount= csbuf.Find("}",nstatcount );
		
	}
}




void CGETINFO::OnOneInfo() 
{
	
	int n =m_ctrl_list.GetNextItem(-1,   LVIS_SELECTED);   
	
	char bbbb[MAX_PATH];
	m_ctrl_list.GetItemText(n,1,bbbb,MAX_PATH);
	
	
	char bufweb[MAX_PATH];
	sprintf(bufweb,"%s%s",WEB_GETONEINFO,bbbb);
	m_web = bufweb;
	UpdateData(false);
	
	
	char *buf = new char[MAX_PACK];
	if (buf)
	{
		jein_outinfo("准备得到:%s",bufweb);
		jein_gethtml(bufweb,buf,MAX_PACK-1);
		jein_outinfo("获取网页成功");
		
		FX_TIAN(buf);
		delete buf;
		
	}
}
//////////////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////////////
//专用线程,刷新列表中的信息
UINT Tscaninfo(LPVOID lp)
{
	
	
	CGETINFO *jein = (CGETINFO*)lp;
	if (jein==0)	return 0;
	//////////////////////////////////////////////////////////////////////////
	
	
	for (int i=0;i<jein->m_allnum;i++)	//对所有好友分析
	{
		//jein->m_ctrl_list.GetItemText(i,1,userid,64);	//得到这个人的ID
		jein->FX_TIAN(i);	//逐个分析
		Sleep(50);
		
	}
	
	
	
	if(jein->m_allnum == 0) Sleep( 200 );
	return 1;
}


//对列表好友线程检测
void CGETINFO::OnButton12() 
{
	//////////////////////////////////////////////////////////////////////////
//	AfxBeginThread(Tscaninfo,this);
	
	
}


//从玩家数组中取出信息
void CGETINFO::FX_TIAN(int nid)
{
	
	//////////////////////////////////////////////////////////////////////////
	char bufweb[255];	//格式化的网页地址
	sprintf(bufweb,"%s%d",WEB_GETONEINFO,friendinfo[nid].userId);
	
	
	char *buf = new char[MAX_PACK];
	if (buf)
	{
		//jein_outinfo("好友ID:%d 准备得到:%s",friendinfo[nid].userId,bufweb);
		jein_gethtml(bufweb,buf,MAX_PACK-1);
		jein_outinfo("访问:%s " ,bufweb  );
		//得到信息成功.开始分析
		
	}
	else
	{
		return;
	}
	//////////////////////////////////////////////////////////////////////////
	CString csbuf=buf;
	int nstatcount=5;	//开始点
	CString csa;	//植物种类 
	CString csDj;	//成熟等级
	CString cstime;	//
	//////////////////////////////////////////////////////////////////////////
	friendinfo[nid].ntiannum=0;	//每个角色计数值物数
	for (int i=0;i<64;i++)
	{
		nstatcount = csbuf.Find("{",nstatcount);
		if (nstatcount==-1 || nstatcount== 0)	break;
		
		if(FindQQstr(csbuf,"a",nstatcount,csa) ==0)	break;
		FindQQstr(csbuf,"q",nstatcount,cstime);	
		int type = atoi(csa);	//得到他的类型
		if (type!=0)	// 
		{
			FindQQstr(csbuf,"b",nstatcount,csDj);	//成熟等级
			int csdj = atoi(csDj); 
			friendinfo[nid].tian_info[friendinfo[nid].ntiannum].dj = csdj;	//成熟等级
			
			//////////////////////////////////////////////////////////////////////////
			char sztimeformat[64];
			int dwtime=atoi(cstime);
			TimeFormat(dwtime,sztimeformat);
			//////////////////////////////////////////////////////////////////////////
			//复制植物名
			strcpy(friendinfo[nid].tian_info[friendinfo[nid].ntiannum].szzhiwuname,  dongxi[type].name);//名字
			
			strcpy(friendinfo[nid].tian_info[friendinfo[nid].ntiannum].sztime,  sztimeformat);	//时间
			
			//jeinzt[csdj].ztname由他的状态得到
			
			friendinfo[nid].ntiannum++;	//种下的东西++
			
		}
		
		nstatcount= csbuf.Find("}",nstatcount );
		
	}
	
	csbuf.Empty();
	delete buf;
	
}

//读取玩家数组,将田地信息显示到列表中
void CGETINFO::AddInfoTian() 
{
	
	CString str;
	
	for (int i=0;i<m_allnum ;i ++ )
	{
		for (int j=0;j<friendinfo[i].ntiannum;j++)	//对他的田
		{ 
			int nlist =  m_ctrl_list.GetItemCount();
			
			str.Format("%d",nlist);
			int dj = friendinfo[i].tian_info[j].dj;
			m_ctrl_list.InsertItem(nlist,str);	//添加一行
			
			m_ctrl_list.SetItemText(nlist,1, friendinfo[i].userName  );	//角色名
			m_ctrl_list.SetItemText(nlist,3, friendinfo[i].tian_info[j].szzhiwuname );	//植物名
			
			m_ctrl_list.SetItemText(nlist,4, friendinfo[i].tian_info[j].sztime );	//植物名
			
			//jeinzt[csdj].ztname由他的状态得到
			
			m_ctrl_list.SetItemText(nlist,5, jeinzt[dj].ztname );
			
		}
		
	}
	
}

void CGETINFO::OnButton3() 
{
	InitTab();
	AddInfoTian();
}

CString CGETINFO::GetZTname(int nDJ)	//由状态等级返回其状态名
{
	return jeinzt[nDJ].ztname;
	
}